home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
051-060
/
amok58
/
audiosupport1.1
/
audiodemo.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
3KB
|
98 lines
(*-------------------------------------------------------------------------
:Program. AudioDemo.mod
:Contents. Die Shepard Tonskala
:Author. Christian Stiens
:Address. Heustiege 2, W-4710 Lüdinghausen
:Copyright. PD
:Language. OBERON
:Translator. Amiga Oberon V2.01, [fbs]
:Imports. AudioSupport
-------------------------------------------------------------------------*)
MODULE AudioDemo;
IMPORT
e : Exec,
sys: SYSTEM,
as : AudioSupport,
g : Graphics,
d : Dos,
t : MathTrans,
I : Intuition;
CONST (* $DataChip+ *)
wave = "\x00\x5A\x7F\x5A\x00\xA6\x81\xA6";
VAR
nw : I.NewWindow;
win : I.WindowPtr;
rp : g.RastPortPtr;
msg : I.IntuiMessagePtr;
i : INTEGER;
arg : ARRAY 4 OF REAL;
chan : SHORTINT;
CONST
closeWindow = LONGSET{I.closeWindow};
normalWindow = LONGSET{0..3,10,12};
PROCEDURE PlayShepard(chan: SHORTINT; a: REAL); (* 0 <= a < 1 *)
VAR per,vol: INTEGER;
BEGIN
vol := SHORT(ENTIER((1-t.Cos(6.2831853*a)) * 32 + 0.5));
per := SHORT(ENTIER(300 * t.Exp((1.0-a)*1.38629436) + 0.5));
as.ModifySound(chan,per,vol);
END PlayShepard;
BEGIN
win := NIL;
i := 0; WHILE i < 4 DO
chan := as.OpenChannel({i});
as.PlaySound(chan,sys.ADR(wave),8,500,0,0);
INC(i) END;
nw := I.NewWindow(50,50,450,70,-1,-1,closeWindow,normalWindow,NIL,NIL,
sys.ADR("The Shepard Scale"),NIL,NIL,90,40,-1,-1,{0});
win := I.OpenWindow(nw); IF win = NIL THEN HALT(0) END;
rp := win.rPort; g.SetAPen(rp,1);
g.Move(rp,10,10);
g.Text(rp,"Die Shepard-Tonskala erzeugt den Eindruck eines",49);
g.Move(rp,10,18);
g.Text(rp,"scheinbar immer höher werdenden Tones, der durch",49);
g.Move(rp,10,26);
g.Text(rp,"das zeitversetzte Spielen mehrerer Tonleitern",49);
g.Move(rp,10,34);
g.Text(rp,"erreicht wird, wobei die Lautstärke am Anfang und",49);
g.Move(rp,10,42);
g.Text(rp,"am Ende der Skala klein und in der Mitte der",49);
g.Move(rp,10,50);
g.Text(rp,"Skala am größten ist. ",49);
i := 0; WHILE i < 4 DO
arg[i] := i/4;
INC(i) END;
LOOP
msg := e.GetMsg(win.userPort);
IF msg # NIL THEN
IF I.closeWindow IN msg.class THEN e.ReplyMsg(msg); EXIT END;
e.ReplyMsg(msg);
END;
i := 0; WHILE i < 4 DO
PlayShepard(SHORT(i),arg[i]);
arg[i] := arg[i] + (1/48);
IF arg[i] >= 1 THEN arg[i] := arg[i] - 1 END;
INC(i) END;
d.Delay(20);
END;
CLOSE
IF win # NIL THEN I.CloseWindow(win) END;
END AudioDemo.